﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AgileSaude.Entities;
using AgileSaude.Data;
using AgileSaude.Data.Repository;
using FBS.Framework;
using AgileSaude.Business.Validation;

namespace AgileSaude.Business.Process
{
    internal class CidadeProcess
    {
        internal Resultado Incluir(CidadeEntities pObj)
        {
            Resultado resultado = new Resultado();

            try
            {
                resultado.Sucesso = true;

                if (resultado.Sucesso)
                {
                    cidade obj = new cidade();
                    Util.CopyPropertyValues(pObj, obj);

                    new cidadeRepository().Add(obj);
                }
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Incluir", "CidadeProcess");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Alterar(CidadeEntities pObj)
        {
            Resultado resultado = new Resultado();
            cidadeRepository cidadeRepository = new cidadeRepository();

            try
            {
                cidade user = cidadeRepository.getcidade(pObj.idcidade);
                Util.CopyPropertyValues(pObj, user);

                cidadeRepository.Update();
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Deletar(CidadeEntities pObj)
        {
            Resultado resultado = new Resultado();
            cidadeRepository CidadeRepository = new cidadeRepository();

            try
            {
                cidade obj = CidadeRepository.getcidade(pObj.idcidade);
                Util.CopyPropertyValues(pObj, obj);

                CidadeRepository.Delete(obj);
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal CidadeEntities GetCidade(int pIdCidade)
        {
            cidade oData = new cidadeRepository().getcidade(pIdCidade);

            if (oData == null)
            {
                return new CidadeEntities();
            }
            else
            {
                return GetCidade(oData);
            }

        }

        internal CidadeEntities GetCidade(string pNome)
        {
            cidade oData = new cidadeRepository().getcidade(pNome);

            if (oData != null)
            {
                return GetCidade(oData);
            }
            else
            {
                return null;
            }

        }

        private static CidadeEntities GetCidade(cidade oData)
        {
            CidadeEntities oEntitie = new CidadeEntities();

            Util.CopyPropertyValues(oData, oEntitie);

            return oEntitie;
        }

        internal List<CidadeEntities> Listar(CidadeEntities pFiltro, ref Resultado resultado)
        {
            List<CidadeEntities> lista = new List<CidadeEntities>();

            if (pFiltro == null)
            {
                pFiltro = new CidadeEntities();
            }

            try
            {
                var cidade = from u in new cidadeRepository().GetAll()
                              where (string.IsNullOrEmpty(pFiltro.Nome) || u.Nome.ToUpper().Contains(pFiltro.Nome.ToUpper())) &&
                               (pFiltro.idcidade == 0 || u.idcidade == pFiltro.idcidade)
                              select u;

                foreach (cidade user in cidade)
                {
                    lista.Add(GetCidade(user));
                }

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Listar", "CidadeProcess");
                resultado.Sucesso = false;
            }

            return lista;
        }
    }
}
